﻿// 291. 蒙德里安的梦想 jichu.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <assert.h>
#include <cstring>


using namespace std;
/*
https://www.acwing.com/problem/content/293/
求把 N×M 的棋盘分割成若干个 1×2 的长方形，有多少种方案。
例如当 N=2，M=4 时，共有 5 种方案。当 N=2，M=3 时，共有 3 种方案。

如下图所示：
2411_1.jpg

输入格式
输入包含多组测试用例。
每组测试用例占一行，包含两个整数 N 和 M。
当输入用例 N=0，M=0 时，表示输入终止，且该用例无需处理。

输出格式
每个测试用例输出一个结果，每个结果占一行。

数据范围
1≤N,M≤11
输入样例：
1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0
输出样例：
1
0
1
2
3
5
144
51205


1 2
2 2
3 2
*/


const int N = 12;
bool cnt[1<<N];
int n, m;
long long dp[N][1 << N];

void init( int x) {
	memset(cnt, 0, sizeof cnt);
	for (int i = 0; i < 1 << x; i++) {
		//检测每个数据的0 必须为偶数
		bool curr = true;
		for (int j = 0; j < x;) {
			if (x - 1 == j && ((i >> j) & 1) == 0) { curr = false; break; }
			else if ( ((i >> j) & 1) == 0 && ( (i >> (j+1)) & 1) == 0 ) {
				j += 2;
			}
			else if (((i >> j) & 1) == 0 && ( (i>> (j+1)) & 1) == 1) {
				curr = false; break;
			}
			else if ( ((i >> j) & 1) == 1) {
				j++;
			}
		}
		cnt[i] = curr;
	}
}



int main()
{
	while (cin >> n >> m) {
		if (n == 0 && m == 0) { break; }
		memset(dp, 0, sizeof dp);
		dp[0][0] = 1;
		init(m);
		for (int i = 0; i < n; i++) {
			for (int curr = 0; curr < 1 << m; curr++) {
				for (int next = 0; next < 1 << m; next++) {
					if ( (curr & next) == 0 && cnt[curr | next] == true) {
						dp[i + 1][next] += dp[i][curr];
					}
				}
			}
		}
		
		cout << dp[n][0] << endl;
	}

	return 0;
}

 